home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d12
/
asm_msc1.arc
/
EXECSUB.ASM
< prev
next >
Wrap
Assembly Source File
|
1988-11-20
|
3KB
|
121 lines
; EXECSUB - execute program from compiled BASIC - requires DOS 2.00
; Copyright 1983 Data Base Decisions
; CALL EXECSUB(PROG$,PARM$,FCB1$,FCB2$,RETCD%)
; PROG$ is the program name (e.g. 'command.com')
; PARM$ is the parameter to be passed to the program (e.g. '/c dir *.bas')
; FCB1$ is the first file control block (required by some programs)
; FCB2$ is the second file control block (required by some programs)
; RETCD% is the error return code
skip equ 2 ; 1 for interpretive, 2 for compiled
cseg segment para public 'code'
public execsub
execsub proc far
assume cs:cseg,ds:cseg,ss:nothing,es:nothing
push bp
mov bp,sp
jmp p010
stak equ this byte
dw 0 ; save sp
dw 0 ; save ss
prm1 equ this byte
dw 0 ; environment
prm2 equ this word
dw 0 ; command line - ip & cs
dw 0
prm3 equ this byte
dw 0 ; default FCB - ip & cs
dw 0
prm4 equ this byte
dw 0 ; second default FCB - ip & cs
dw 0
p010:
mov ax,0 ; get psp
mov es,ax
mov di,4f2h ; point to dos comm. area
mov ax,es:[di] ; get psp segment
mov es,ax
mov di,2
mov bx,es:[di] ; get top of memory
sub bx,ax ; subtract psp
mov ah,4ah
int 21h ; free memory
jnc p020 ; no error
mov ah,0 ; memory error
jmp p090 ; to error control
p020: mov si,[bp+12] ; point to parm$
add si,skip
mov ax,[si]
mov si,offset prm2 ; establish command line
mov cs:[si],ax
mov ax,ds
mov cs:[si+2],ax
mov si,[bp+10] ; point to fcb1$
add si,skip
mov ax,[si]
mov si,offset prm3
mov cs:[si],ax
mov ax,ds
mov cs:[si+2],ax
mov si,[bp+8] ; point to fcb2$
add si,skip
mov ax,[si]
mov si,offset prm4 ; establish second fcb
mov cs:[si],ax
mov ax,ds
mov cs:[si+2],ax
push bp ; save registers
push ds
push es
pushf
mov si,offset stak ; save stack
mov cs:[si],sp
mov cs:[si+2],ss
mov ah,4bh ; load prog
mov al,0 ; load & execute
mov si,[bp+14] ; point to prog$
add si,skip
mov dx,[si]
push cs
pop es
mov bx,offset prm1 ; point to parameter
int 21h ; load & execute program
jnc p050 ; no error
mov ah,1 ; set error code
jmp p060
p050: mov ax,0 ; clear error
p060: mov bx,cs ; restore stack
mov ds,bx
mov si,offset stak
cli ; no interrupts
mov sp,cs:[si]
mov ss,cs:[si+2]
sti ; allow interrupts
popf ; restore registers
pop es
pop ds
pop bp
p090: mov si,[bp+6] ; point to RETCD%
mov [si],ax ; return error, if any
pop bp ; return to caller
ret 10
execsub endp
cseg ends
end